JwtService 類別負責處理JWT的生成、解析和驗證。這些操作是透過使用一個密鑰(SECRET_KEY)來進行簽名和驗證,以確保數據的完整性和安全性。
@Service
public class JwtService {
private static final String SECRET_KEY = "your-secret-key";
}
extractUserName 方法通過 JWT token 提取用戶名。它內部調用了
extractClaims 方法來解析 token,並返回 JWT 的主題( subject ),即用戶名。
public String extractUserName(String token) {
return extractClaims(token, Claims::getSubject);
}
extractClaims 方法是一個通用方法,用於提取JWT中的任何聲明(claims)。它接受一個 Function 作為參數,用於從 Claims 對象中提取特定的數據。
public <T> T extractClaims(String token, Function<Claims,T> claimsResolver) {
final Claims claims = extractClaims(token);
return claimsResolver.apply(claims);
}
generateToken 方法有兩個重載版本。第一個版本只接收 UserDetails 對象並生成一個不含附加聲明的JWT。
public String generateToken(UserDetails userDetails) {
return generateToken(new HashMap<>(), userDetails);
}
第二個版本允許添加自定義附加聲明,並生成包含這些聲明的JWT。
public String generateToken(Map<String, Object> extraClaims, UserDetails userDetails) {
return Jwts
.builder()
.setClaims(extraClaims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 10))
.signWith(getSignInKey(), SignatureAlgorithm.HS256)
.compact();
}